package cn.lijia.itrip.service.impl;
import cn.lijia.itrip.common.*;
import cn.lijia.itrip.exception.ItripException;
import cn.lijia.itrip.service.ItripUserService;
import cn.lijia.itrip.mapper.ItripUserMapper;
import cn.lijia.itrip.model.ItripUser;
import com.cloopen.rest.sdk.CCPRestSmsSDK;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;

@Service("itripUserService")
public class ItripUserServiceImpl implements ItripUserService {

    @Resource
    private ItripUserMapper itripUserMapper;

    public ItripUser getById(Long id)throws Exception{
        return itripUserMapper.getById(id);
    }

    public List<ItripUser> getListByMap(Map<String,Object> param)throws Exception{
        return itripUserMapper.getListByMap(param);
    }

    public Integer getCountByMap(Map<String,Object> param)throws Exception{
        return itripUserMapper.getCountByMap(param);
    }

    public Integer save(ItripUser itripUser)throws Exception{
            itripUser.setCreationDate(new Date());
            return itripUserMapper.save(itripUser);
    }

    public Integer modify(ItripUser itripUser)throws Exception{
        itripUser.setModifyDate(new Date());
        return itripUserMapper.modify(itripUser);
    }

    public Integer removeById(Long id)throws Exception{
        return itripUserMapper.removeById(id);
    }

    public Page<List<ItripUser>> queryPageByMap(Map<String,Object> param,Integer pageNo,Integer pageSize)throws Exception{
        Integer total = itripUserMapper.getCountByMap(param);
        pageNo = EmptyUtils.isEmpty(pageNo) ? Constants.DEFAULT_PAGE_NO : pageNo;
        pageSize = EmptyUtils.isEmpty(pageSize) ? Constants.DEFAULT_PAGE_SIZE : pageSize;
        Page page = new Page(pageNo, pageSize, total);
        param.put("beginPos", page.getBeginPos());
        param.put("pageSize", page.getPageSize());
        List<ItripUser> itripUserList = itripUserMapper.getListByMap(param);
        page.setRows(itripUserList);
        return page;
    }

    @Override
    public ItripUser login(String userCode, String userPassword) throws Exception {
        //判断用户账号是否存在
        ItripUser itripUser = this.findByUserCode(userCode);
        if (itripUser != null){
            //判断密码是否正确
            System.out.println(userPassword);
            String md5UserPassword = DigestUtil.hmacSign(userPassword);
            if (md5UserPassword.equals(itripUser.getUserPassword())){
                //判断用户是否激活
                if(itripUser.getActivated() == 1){
                    //激活成功
                    return itripUser;
                }else{
                    throw new ItripException("用户未激活",ErrorCode.AUTH_LOGIN_FAILURE);
                }
            }else{
                throw new ItripException("用户名或密码错误",ErrorCode.AUTH_LOGIN_FAILURE);
            }
        }else {
            throw new ItripException("用户名不存在", ErrorCode.AUTH_LOGIN_FAILURE);
        }
    }

    @Override
    public ItripUser findByUserCode(String userCode) throws Exception {
        Map<String,Object> param = new HashMap<>();
        param.put("userCode",userCode);
        List<ItripUser> itripUserList = getListByMap(param);
        return itripUserList != null && itripUserList.size() > 0? itripUserList.get(0):null;
    }

    @Override
    public HashMap SDKSendTemplateSMS(String phone) {

        HashMap<String, Object> result = null;

        //初始化SDK
        CCPRestSmsSDK restAPI = new CCPRestSmsSDK();

        //******************************注释*********************************************
        //*初始化服务器地址和端口                                                       *
        //*沙盒环境（用于应用开发调试）：restAPI.init("sandboxapp.cloopen.com", "8883");*
        //*生产环境（用户应用上线使用）：restAPI.init("app.cloopen.com", "8883");       *
        //*******************************************************************************
        restAPI.init("sandboxapp.cloopen.com", "8883");

        //******************************注释*********************************************
        //*初始化主帐号和主帐号令牌,对应官网开发者主账号下的ACCOUNT SID和AUTH TOKEN     *
        //*ACOUNT SID和AUTH TOKEN在登陆官网后，在“应用-管理控制台”中查看开发者主账号获取*
        //*参数顺序：第一个参数是ACOUNT SID，第二个参数是AUTH TOKEN。                   *
        //*******************************************************************************
        restAPI.setAccount("8aaf070865796a5701658d9e95810fdc", "62683af8fe7e43018e66863a6c97c69c");


        //******************************注释*********************************************
        //*初始化应用ID                                                                 *
        //*测试开发可使用“测试Demo”的APP ID，正式上线需要使用自己创建的应用的App ID     *
        //*应用ID的获取：登陆官网，在“应用-应用列表”，点击应用名称，看应用详情获取APP ID*
        //*******************************************************************************
        restAPI.setAppId("8aaf070865796a5701658d9e95d90fe2");


        //******************************注释****************************************************************
        //*调用发送模板短信的接口发送短信                                                                  *
        //*参数顺序说明：                                                                                  *
        //*第一个参数:是要发送的手机号码，可以用逗号分隔，一次最多支持100个手机号                          *
        //*第二个参数:是模板ID，在平台上创建的短信模板的ID值；测试的时候可以使用系统的默认模板，id为1。    *
        //*系统默认模板的内容为“【云通讯】您使用的是云通讯短信模板，您的验证码是{1}，请于{2}分钟内正确输入”*
        //*第三个参数是要替换的内容数组。                                                                                                                             *
        //**************************************************************************************************

        //**************************************举例说明***********************************************************************
        //*假设您用测试Demo的APP ID，则需使用默认模板ID 1，发送手机号是13800000000，传入参数为6532和5，则调用方式为           *
        //*result = restAPI.sendTemplateSMS("13800000000","1" ,new String[]{"6532","5"});                                                                         *
        //*则13800000000手机号收到的短信内容是：【云通讯】您使用的是云通讯短信模板，您的验证码是6532，请于5分钟内正确输入     *
        //*********************************************************************************************************************

        //获取随机验证码
        Random r = new Random();
        //获得四位随机数即验证码
        int code = r.nextInt(9000)+1000;

        result = restAPI.sendTemplateSMS(phone,"1" ,new String[]{String.valueOf(code),"4"});

        System.out.println("SDKTestGetSubAccounts result=" + result);
        if("000000".equals(result.get("statusCode"))){
            //正常返回输出data包体信息（map）
            HashMap<String,Object> data = (HashMap<String, Object>) result.get("data");
            Set<String> keySet = data.keySet();
            for(String key:keySet){
                Object object = data.get(key);
                System.out.println(key +" = "+object);
            }
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("code", "200");
            map.put("msg", "请求成功！");
            map.put("date", "获取验证码成功！");
            map.put("valCode",code);
            return map;
        }else{
            //异常返回输出错误码和错误信息
            System.out.println("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("code", "403");
            map.put("msg", "请求失败！");
            map.put("data", "错误信息："+result.get("statusMsg"));
            return map;
        }
    }


}
